#ifndef __FDCAN_H
#define __FDCAN_H

#include "stm32g4xx_hal.h"

#define   FDCAN_TX_PORT  GPIOA
#define   FDCAN_TX_PIN   GPIO_PIN_12
#define   FDCAN_RX_PORT  GPIOA
#define   FDCAN_RX_PIN   GPIO_PIN_11

// CAN消息ID定义
#define CAN_MSG_ID_TARGET_SPEED     0x100    // F103发送目标速度给G4
#define CAN_MSG_ID_STOP   0x101    // 紧急停止指令
#define CAN_MSG_ID_START     0x102    // F103发送启动指令给G4
#define CAN_MSG_ID_ACTUAL_SPEED     0x200    // G4发送实际速度给F103

// CAN消息数据长度
#define CAN_MSG_TARGET_SPEED_LEN    8
#define CAN_MSG_ACTUAL_SPEED_LEN    8

// 消息队列配置
#define CAN_RX_QUEUE_SIZE          8        // 接收队列大小

// 目标速度消息结构体
typedef struct
{
    uint32_t target_speed;      // 目标速度值 (RPM)
    uint8_t  direction;         // 旋转方向: 0=正转, 1=反转
    uint8_t  reserved[3];       // 保留字节
} can_target_speed_msg_t;

// 实际速度消息结构体  
typedef struct
{
    uint32_t actual_speed;      // 实际速度值 (RPM)
    uint16_t pwm_duty;          // PWM占空比
    uint8_t  motor_state;       // 电机状态: 0=停止, 1=运行
    uint8_t  reserved;          // 保留字节
} can_actual_speed_msg_t;

// CAN接收消息队列项
typedef struct {
    uint32_t msg_id;           // 消息ID
    uint8_t  data[8];          // 消息数据
    uint8_t  dlc;              // 数据长度
    uint32_t timestamp;        // 时间戳
} can_rx_queue_item_t;

// CAN接收队列结构体
typedef struct {
    can_rx_queue_item_t items[CAN_RX_QUEUE_SIZE];
    volatile uint8_t head;      // 队列头指针
    volatile uint8_t tail;      // 队列尾指针
    volatile uint8_t count;     // 队列中消息数量
} can_rx_queue_t;

// 函数声明
void fdcan_init(void);
void fdcan_send_actual_speed(uint32_t speed,uint8_t direction);
void fdcan_process_emergency_stop(void);
void fdcan_process_target_speed_in_isr(uint8_t *data);
uint8_t fdcan_queue_get_message(can_rx_queue_item_t *msg);
uint8_t fdcan_get_motor_start_request(void);
uint8_t fdcan_get_direction_change_request(uint8_t *direction, uint32_t *speed);
void fdcan_clear_direction_change_request(void);

#endif
